package com.xxxx.crm.service;

import com.xxxx.crm.base.BaseService;
import com.xxxx.crm.dao.ModuleMapper;
import com.xxxx.crm.dao.PermissionMapper;
import com.xxxx.crm.dao.RoleMapper;
import com.xxxx.crm.utils.AssertUtil;
import com.xxxx.crm.vo.Permission;
import com.xxxx.crm.vo.Role;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author:王亚栋
 * @Date:2023/2/5 18:48
 * @Version:1.0
 */
@Service
public class RoleService extends BaseService<Role,Integer> {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private PermissionMapper permissionMapper;
    @Autowired
    private ModuleMapper moduleMapper;

    /**
     * 查询所有角色信息
     * @return
     */
    public List<Map<String,Object>> queryAllRoles(Integer userId){

        return roleMapper.queryAllRoles(userId);
    }

    /**
     * 添加角色
     * @param role
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addRole(Role role){

        /**
         * 参数校验
         */
        AssertUtil.isTrue(StringUtils.isBlank(role.getRoleName()),"角色名称不能为空！");
        //通过角色名查询角色记录
        Role temp = roleMapper.selectByRoleName(role.getRoleName());

        //判断角色记录是否存在
        AssertUtil.isTrue(temp != null,"角色名称已存在，请重新输入！");

        /**
         * 设置参数默认值
         */
        role.setIsValid(1);

        role.setCreateDate(new Date());

        role.setUpdateDate(new Date());

        //执行添加操作
       AssertUtil.isTrue(roleMapper.insertSelective(role) != 1,"添加角色失败！");
    }

    /**
     * 修改角色功能
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateRole(Role role){

        /**
         * 参数校验
         */
        AssertUtil.isTrue(null == role.getId(),"待更新记录不存在！");
        //通过角色ID查询角色记录
        Role temp = roleMapper.selectByPrimaryKey(role.getId());
        //判断角色记录是否存在
        AssertUtil.isTrue(null == temp,"待更新记录不存在！");

        //角色名称  非空，唯一
        AssertUtil.isTrue(StringUtils.isBlank(role.getRoleName()),"角色名称不能为空！");

        temp = roleMapper.selectByRoleName(role.getRoleName());

        //判断角色记录是否存在（存在则不能使用，不存在，且角色ID与当前更新的角色ID不一致，表示角色名称不可用）
        AssertUtil.isTrue(null != temp && (temp.getId().equals(role.getId())),"角色名称已存在，不可使用");

        //设置参数的默认值
        role.setUpdateDate(new Date());

        //执行更新条件，判断受影响行数
        AssertUtil.isTrue(roleMapper.updateByPrimaryKeySelective(role) != 1,"角色信息修改失败！");


    }

    /**
     *删除角色
     * @param roleId
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteRole(Integer roleId){

        //参数校验 角色Id  非空
        AssertUtil.isTrue(null == roleId,"待删除记录不存在！");
        //查询角色记录是否存在
        Role role = roleMapper.selectByPrimaryKey(roleId);
        AssertUtil.isTrue(null == role,"待删除记录不存在！");

        //设置默认值
        role.setUpdateDate(new Date());
        role.setIsValid(0);

        //执行删除操作
        AssertUtil.isTrue(roleMapper.updateByPrimaryKeySelective(role) < 1 ,"删除角色操作失败！");

    }

    /**
     * 角色授权
     *      将对应的角色ID与资源ID，添加到对应的权限表中
     *          1.直接添加权限--这样不合适，会出现重复的权限数据问题（执行修改权限操作后删除权限操作）
     *          推荐使用：
     *          先将已有的权限记录删除，再将需要设置的权限记录添加
     *          1.通过角色ID查询对应的权限记录
     *          2.如果权限记录存在，则删除对应的角色拥有的权限记录
     *          3.如果有权限记录，则添加权限记录
     * @param roleId
     * @param mIds
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addGrant(Integer roleId,Integer[] mIds) {

        //1.通过角色ID查询对应的权限记录
       Integer count =  permissionMapper.countPermissionByRoleId(roleId);

       //2.如果权限记录存在，则删除对应的角色拥有的权限记录
       if (count > 0){

           //删除权限记录
           permissionMapper.deletePermissionByRoleId(roleId);

       }
       //3.如果有权限记录，则添加权限记录
        if (mIds != null && mIds.length > 0){
            //定义Permission集合
            List<Permission> permissionList = new ArrayList<>();

            //遍历资源ID数组
            for (Integer mId : mIds){

                Permission permission = new Permission();
                permission.setModuleId(mId);
                permission.setAclValue(moduleMapper.selectByPrimaryKey(mId).getOptValue());
                permission.setRoleId(roleId);
                permission.setCreateDate(new Date());
                permission.setUpdateDate(new Date());

                //将对象设置到集合中
                permissionList.add(permission);
            }

            //执行批量添加操作，判断受影响的行数
            AssertUtil.isTrue(permissionMapper.insertBatch(permissionList) != permissionList.size(),"角色授权失败！");
        }





    }
}
